#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

#define THREAD_COUNT 2

int g_tickets = 100;
pthread_mutex_t l;

void* get_tickets_start(void* arg){
    while(1){
        pthread_mutex_lock(&l);
        if(g_tickets > 0){
            //1.打印下-
            printf("i am %p, i get ticket %d\n", pthread_self(), g_tickets);
            //2.减减
            g_tickets--;
        }else{ // g_tickets <=0
            pthread_mutex_unlock(&l);
            break;
        }
        pthread_mutex_unlock(&l);
    }
    return NULL;
}


int main(){
    /*
     * 1.创建黄牛（线程）
     *   黄牛抢票（写线程入口函数当中的代码）
     * */
    // 注意 ： 如果要等待线程退出， 则再创建线程的时候， 一定要保存线程的标识符
    //初始化一定要在创建线程之前， 因为线程被创建成功之后，就有可能直接进行加锁，访问临界区代码了
    pthread_mutex_init(&l, NULL);

    pthread_t tid[THREAD_COUNT];
    for(int i = 0; i < THREAD_COUNT; i++){
        int ret = pthread_create(&tid[i], NULL, get_tickets_start, NULL);
        if(ret < 0){
            return 0;
        }
    }

    //执行线程等待的代码
    for(int i = 0; i < THREAD_COUNT; i++){
        pthread_join(tid[i], NULL);
    }
    //销毁， 一定要在线程退出之后（保证没有其他线程在使用该互斥锁的前提下进行）
    pthread_mutex_destroy(&l);
    return 0;
}
